67 类和对象的绑定方法与非绑定方法

256次阅读
没有评论

共计 2512 个字符,预计需要花费 7 分钟才能阅读完成。

引入

类的定义方法大致可以分为两类 : 绑定方法和非绑定方法

其中绑定方法又可以分为 绑定到对象 的方法和 绑定到类 的方法

一. 绑定方法

1. 对象的绑定方法

  • 在类中没有被任何装饰器修饰的方法就是绑定给对象的方法, 这类方法专门为对象定制的
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def print_name(self):
        print(self.name)

    def print_age(self):
        print(self.age)

P1 = Person('shawn',22)
P1.print_name()  # shawn
print(Person.__dict__['print_name'])  # <function Person.print_name at 0x00000168C1A54DC8>

通过 __dict__ 查看类的属性字典, 我们可以发现 print_name 即为绑定到对象的方法, 这个方法不在对象的名称空间中, 而是在类的名称空间中

对象调用绑定给对象的方法, 这里会有一个自动传值的过程, 即自动将当前对象传递给方法的第一个参数, 也就是 "self" (约定俗成的叫 self, 也可以叫别的)

若是类调用, 则第一个参数需要手动传值

🍖先实例出一个对象
P1 = Person('shawn',22)

🍖对象调用绑定给对象的方法
P1.print_name()       # shawn 

🍖类调用绑定给对象的方法
Person.print_name(P1) # shawn

2. 类的绑定方法

  • 在类中使用 @classmethod 修饰的方法就是绑定给类使用的方法, 这类方法专门为类定制的
  • 通过类名调用绑定给类的方法的时候, 会将类本身当做参数传给类方法的第一个参数 "cls"(和 self 类似, 也可以叫别的名字)
class Computer:
    name = " 痞老板 "
    age = 19119
    money = 90999

    @classmethod
    def user_info(cls):
        print(cls)
        print(cls.__name__)
        print(cls.name, cls.age, cls.money)

Computer.user_info()  # 类调用
'''<class'__main__.Computer'>
Computer
痞老板 19119 90999
'''

注意 : 对象调用绑定给类的方法, 传入的还是这个对象对应的类

Computer().user_info()  # 对象调用 (输出结果还是一样)
'''<class'__main__.Computer'>
Computer
痞老板 19119 90999
'''

二. 非绑定方法

  • 在类的内部使用 @staticmethod 修饰的方法即为非绑定方法, 这类方法和普通的函数没有什么区别, 不与类或对象绑定
  • 谁都可以来调用, 且没有自动传值的效果, 那么为什么还要定义在类里面呢, 直接放在外面不就好了, 这是为了方便管理
import hashlib


class User:
    def __init__(self, name):
        self.name = name

    @staticmethod
    def passwd_encrypt(salt, passwd):
        mima = hashlib.md5(salt.encode("utf-8"))
        mima.update(passwd.encode("utf-8"))
        return mima.hexdigest()

🍖类调用
ciphertext = User.passwd_encrypt("haha", '123')
# 01ddae4032e17a1c338baac9c4322b30
print(User.passwd_encrypt)
# <function User.passwd_encrypt at 0x000001442FF1EEE8> 可以发现就是个普通函数

🍖对象调用
P1 = User(" 珊迪 ")
ciphertext2 = P1.passwd_encrypt("haha", '123')
# 01ddae4032e17a1c338baac9c4322b30
print(P1.passwd_encrypt)
# <function User.passwd_encrypt at 0x000001442FF1EEE8> 可以发现就是个普通函数

三. 类的绑定方法应用示例

1. 将文件里面的信息取出来实例成对象, 这个对象信息是已经存在的, 而不是新建的对象

  • 先模拟一个文件, 存入信息
import pickle

with open("Duck.json","wb")as f:
    pickle.dump({" 品种 ":" 快跑鸭 "," 大小 ":22," 颜色 ":"yellow"},f)
  • 再把信息拿出来, 通过类的绑定方法创建这个已有信息对象
import pickle

class Duck:
    def __init__(self,breed,size,color):
        self.breed = breed
        self.size = size
        self.color = color

    @classmethod
    def from_file(cls):
        return cls(Breed,Size,Color)

# 从文件里面拿出信息
with open("Duck.json","rb")as f1:
    duck_info = pickle.load(f1)

# 赋值给这些变量
Breed = duck_info[" 品种 "]
Size = duck_info[" 大小 "]
Color = duck_info[" 颜色 "]

# 通过类来调用自己的方法
info = Duck.from_file()
print(info)  # <__main__.Duck object at 0x0000020ACF597A08>
print(info.breed)  # 快跑鸭
print(info.size)   # 22
print(info.color)  # yellow

四. 小结

1. 绑定方法小结

  • 如果函
  • 数体代码需要用外部传入的类,则应该将该函数定义成绑定给类的方法
  • 如果函数体代码需要用外部传入的对象,则应该将该函数定义成绑定给对象的方法

2. 非绑定方法小结

  • 如果函数体代码既不需要外部传入的类也不需要外部传入的对象,则应该将该函数定义成非绑定方法 (普通函数)
正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计2512字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)